#include <iostream>
#include <ctime>
#include <unistd.h>
 
using namespace std;
 
void Test_time(){
    // 该函数返回系统的当前日历时间，自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间，则返回 -1。
    time_t now = time(0);
    cout << now << endl; // 1649043688

    now = time(NULL);
    cout << now << endl; // 1649043688
}

void Test_ctime(){
    time_t now = time(0);
    // 返回一个表示当地时间的字符串,字符串格式如下： Www Mmm dd hh:mm:ss yyyy 其中，Www 表示星期几，Mmm 是以字母表示的月份，dd 表示一月中的第几天，hh:mm:ss 表示时间，yyyy 表示年份。
    char* c = ctime(&now);

    cout << c; // Mon Apr 04 11:45:17 2022
}

void Test_mktime(){
    struct tm t;

    t.tm_sec    = 10;
    t.tm_min    = 10;
    t.tm_hour   = 6;
    t.tm_mday   = 25;
    t.tm_mon    = 2;
    t.tm_year   = 89;
    t.tm_wday   = 6;

    // timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数，发生错误时返回-1。
    int ret = mktime(&t);
    cout << ret << endl; // 606780610
}

void Test_localtime(){
    time_t t = 606780610ul;
    struct tm *ltm;
    
    // 该函数返回一个指向表示本地时间的 tm 结构的指针。
    ltm = localtime( &t );
    cout << "年: "<< 1900 + ltm->tm_year << endl; // 年: 2022
    cout << "月: "<< 1 + ltm->tm_mon<< endl; // 月: 4
    cout << "日: "<<  ltm->tm_mday << endl; // 日: 4
    cout << "时间: "<< ltm->tm_hour << ":" << ltm->tm_min << ":" << ltm->tm_sec << endl; // 时间: 11:58:37
}

void Test_asctime(){
    struct tm t;

    t.tm_sec    = 10;
    t.tm_min    = 10;
    t.tm_hour   = 6;
    t.tm_mday   = 25;
    t.tm_mon    = 2;
    t.tm_year   = 89;
    t.tm_wday   = 6;

    // 返回一个 C 字符串，包含了可读格式的日期和时间信息 Www Mmm dd hh:mm:ss yyyy
    cout << asctime(&t); // Sat Mar 25 06:10:10 1989
}

void Test_gmtime(){
    time_t now = time(0);
    struct tm *ltm;

    // 用协调世界时（UTC）也被称为格林尼治标准时间（GMT）表示
    ltm = gmtime(&now);
    cout << asctime(ltm); // Mon Apr 04 04:10:53 2022
}

void Test_strftime(){
    time_t now = time(0);
    struct tm *ltm = localtime(&now);

    char buffer[80];
    // 格式化结构 timeptr 表示的时间，并把它存储在 str 中。https://www.runoob.com/cprogramming/c-function-strftime.html
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", ltm);
    cout << buffer << endl; // 2022-04-04 12:45:29
}

void Test_difftime(){
    time_t start_t, end_t;
   double diff_t;
 
   printf("程序启动...\n");
   time(&start_t);
 
   printf("休眠 5 秒...\n");
   sleep(5);
 
   time(&end_t);
   diff_t = difftime(end_t, start_t);
 
   printf("执行时间 = %f\n", diff_t);
   printf("程序退出...\n");

   /**
    * 程序启动...
    * 休眠 5 秒...
    * 执行时间 = 5.000000
    * 程序退出...
   */
}

void Test_clock(){
    clock_t start_t, end_t;
    double total_t;
    int i;
    
    // 返回程序执行起（一般为程序的开头），处理器时钟所使用的时间。为了获取 CPU 所使用的秒数，您需要除以 CLOCKS_PER_SEC。在 32 位系统中，CLOCKS_PER_SEC 等于 1000000
    start_t = clock();
    printf("程序启动，start_t = %ld\n", start_t);
        
    printf("开始一个大循环，start_t = %ld\n", start_t);
    for(i=0; i< 10000000; i++)
    {
    }
    end_t = clock();
    printf("大循环结束，end_t = %ld\n", end_t);
    
    total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
    printf("CPU 占用的总时间：%f\n", total_t  );

    /**
        * output:
        * 程序启动，start_t = 141
        * 开始一个大循环，start_t = 141
        * 大循环结束，end_t = 163
        * CPU 占用的总时间：0.022000
    */
}


int main( )
{
    Test_strftime();
}